struct ListNode {
  int val;
  struct ListNode *next;
};

struct ListNode * reverseList(struct ListNode *head)
{
  struct ListNode *pre = NULL; // p 指向节点的【前一个】节点
  struct ListNode *p = head; // 当前遍历的节点
  struct ListNode *next = NULL; // p->next

  // 开始反转
  while (p != NULL)
  {
    // 1. 临时保存 p 的【下一个】节点
    next = p->next;

    // 2. pre->p 逆序为 pre<-p
    p->next = pre;

    // 3. 后移 工作指针
    pre = p; // 先后移 pre
    p = next; // 再后移 p
  }

  return pre;
}
